
const fs = require('fs-extra');
const path = require('path');
const Bmp = require('./class/Bmp');


//  =====程序运行配置=====
//  原数据的存储目录
// const Raw_Data_Dir = "./data";     //  真实数据
const Raw_Data_Dir = "./data_2";   //  模拟生成的数据
//  格式化后的文件目录
const Format_Data_Dir = "./formatted_data";
//  图片文件目录
const Image_File_Dir = "./imgs";


//  读取原始数据目录下的全部文件路径
let files = fs.readdirSync(Raw_Data_Dir);
//  遍历每个文件,格式化数据后以相同的名称存储到(formatted_data/)目录下
for (let file of files) {
  //  原始文件路径
  let file_path = path.join(Raw_Data_Dir, file);
  //  读取文件内容
  let file_data = fs.readJsonSync(file_path, { throws: false }) || [];
  //  新文件数据
  let new_file_data = [];

  //  对文件数据进行格式化([{id:"", temp_id:"", LE:[], HE:[]}]  ==>  [{id:"", temp_id:"", LE:"asfaklfaj1lj1fn23791kjl", HE:"asfaklfaj1lj1fn23791kjl"}]), ///LE&HE 每1个元素转16进制(4长度)字符,然后拼接在一起
  for (let row_data of file_data) {
    let { id, temp_id, LE, HE } = row_data;

    let new_LE = LE.map(point_data => point_data.toString(16).padStart(4, '0')).join("");
    let new_HE = HE.map(point_data => point_data.toString(16).padStart(4, '0')).join("");
    
    // 数据大小端转换, 
    // 如果数据用来模拟设备进行回传则不需要进行转换, 
    // 如果数据用来移到项目中直接使用则需要大小端转换
    // =====================================
    // let new_LE_buffer = Buffer.from(new_LE, "hex");
    // let new_HE_buffer = Buffer.from(new_HE, "hex");
    // for (let i=0; i<new_LE_buffer.length; i+=2) {
    //   let temp = new_LE_buffer[i];
    //   new_LE_buffer[i] = new_LE_buffer[i+1];
    //   new_LE_buffer[i+1] = temp;

    //   temp = new_HE_buffer[i];
    //   new_HE_buffer[i] = new_HE_buffer[i+1];
    //   new_HE_buffer[i+1] = temp;
    // }
    // new_LE = new_LE_buffer.toString('hex');
    // new_HE = new_HE_buffer.toString('hex');
    // =====================================

    new_file_data.push({ id, temp_id, LE: new_LE, HE: new_HE });
  }

  //  格式化后文件内容存储路径
  let new_file_path = path.join(Format_Data_Dir, file);
  fs.outputJsonSync(new_file_path, new_file_data);
}


//  读取格式化化后的全部文件
let format_files = fs.readdirSync(Format_Data_Dir);
//  遍历所有文件生成对应的图片
for (let file of format_files) {
  //  原始文件路径
  let file_path = path.join(Format_Data_Dir, file);
  //  读取文件内容
  let data_arr = fs.readJsonSync(file_path, { throws: false });
  if (data_arr == null) continue;

  //  图片宽高
  //  因为是Buffer字符串,所以2个字符代表1个字节. 因为采集的时候每个点是2字节(ffff)长度,所以再除以2
  let width  = data_arr[0].LE.length / 2 / 2;
  let height = data_arr.length;
  //  整理位图数据
  let buffer = Buffer.alloc(width * 3 * height);
  for (let i = 0; i < data_arr.length; i++) {
    //  buffer字符串 转 buffer
    let LE = Buffer.from(data_arr[i].LE, 'hex');
    //  
    for (let j = 0; j < LE.length; j += 2) {
      //  取高8位数据, 相当于 原数据/256
      let px_value = LE.readUInt8(j);
      buffer.writeUInt8(px_value, i * width * 3 + j / 2 * 3);
      buffer.writeUInt8(px_value, i * width * 3 + j / 2 * 3 + 1);
      buffer.writeUInt8(px_value, i * width * 3 + j / 2 * 3 + 2);
    }
  }
  //  生成BMP图片数据
  let pic = new Bmp(width, height, buffer).out();
  //  保存图片文件
  let img_file_path = path.join(Image_File_Dir, file.replace(".data", ".bmp"));
  fs.outputFileSync(img_file_path, pic);
}

